"""名称空间"""""

# 定义：在python中，当你创建变量、函数、类等，它都会在内存中开辟一个空间来存放，这个空间与变量、类、函数存在绑定关系，这个空间就是名称空间
# 分类：
# 1、内置名称空间(built-in):存放的是python内置的模块，这个空间在启动解释器的时候生效，关闭解释器失效
# 2、全局名称空间(global):存放的是py文件中所有内容，执行该文件的时候生效，执行结束之后失效
# 3、局部名称空间(local):一个函数内容定义的变量，定义的函数，类中定义的函数，这些存放在局部空间中，调用该函数/类时生效，调用结束失效
# 加载顺序：
# 当你运行py文件时，首先先启动解释器，在找到该文件，执行文件，如果文件中有函数/类且调用，执行函数
# 内置名称空间 -> 全局名称空间 -> 局部名称空间
# 查找顺序：
# 先在当前空间查找，如果找不到会向上查找
# 以函数内部举例，在查找一个变量/函数时，查找顺序是：局部名称空间 -> 全局名称空间 -> 内置名称空间


'''作用域'''
# 定义：在程序执行时，可以访问某个变量的区域是什么，它决定了程序的可访问性，内层可以访问外层的东西，反之不可以
# 分类：
# 1、局部作用域(l): 在函数中创建的变量，函数，仅可以在函数内部使用，那么这个变量,函数的作用域就是局部作用域
# 2、嵌套作用域(E): 内函数中创建的变量，函数，仅可以在内函数中使用，那么这个变量的作用域就是嵌套作用域
# 3、全局作用域(G): 在py文件中创建的变量、函数... 同一个名称空间下可以访问，函数内部如想访问，需要声明才可以访问
# 4、内置作用域(B): 在内置空间中创建的任何都行，它的可访问性是内置作用域

# 注意事项：
# 1、局部名称空间如果想改变全局名称的空间的变量，需要global关键字声明
# 2、内函数如果想改变外函数的变量，需要使用nonlocal关键字声明

a = 1  # 全局作用域


def func1():  # 全局名称空间
    b = 2  # 局部作用域
    global a  # 声明使用全局名称空间中的 a
    a += 1
    print(a)

    def inner():
        nonlocal b
        b += 1
        c = 3  # 嵌套作用域